package bootstrap

import (
	"go-web/models"
	"go-web/utils/alilog"
	"os"

	"github.com/beego/beego/v2/core/logs"
	"github.com/gin-gonic/gin"
	"github.com/spf13/viper"

	"go-web/routers"
	"go-web/utils"
)

func Start() {
	InitLog()
	InitConfig()
	InitCommand()
	InitCache()
	// 同步数据库结构命令，会阻止后续程序运行
	InitDb()
	InitWeb()
}

// InitConfig 初始化配置
func InitConfig() {
	// 不存在环境变量，默认走prod
	goRunMode := os.Getenv("GO_RUN_MODE")
	if goRunMode == "" {
		goRunMode = "prod"
	}
	configFile := "app-" + goRunMode
	viper.SetConfigName(configFile)
	viper.AddConfigPath("./config")
	viper.SetConfigType("yml")
	if err := viper.ReadInConfig(); err != nil {
		logs.Error("init config error: %s", err)
	}
}

// InitWeb 初始化web
func InitWeb() {
	gin.SetMode(viper.GetString("ginMode"))
	app := gin.New()
	routers.Load(app)
	app.Run(viper.GetString("addr"))
}

// InitLog 初始化log，采用beego.logs
func InitLog() {
	logs.SetLogger("console")
}

// InitDb 初始化db, 采用gorm
func InitDb() {
	utils.InitDB()
	c := utils.GetCommand()
	syncDb := c.GetParam("syncDb")
	if syncDb.(bool) {
		utils.GetDB().Debug().AutoMigrate(models.AdminParam{}, models.AdminMenu{}, models.AdminUser{})
		os.Exit(0)
	}
}

// InitCache 初始化cache, 采用beego.cache
func InitCache() {
	utils.InitCache()
}

// InitAliLog 初始化阿里云日志服务
func InitAliLog() {
	// 初始化阿里云日志
	opt := alilog.Option{
		AccessKeyID:     viper.GetString("aliLog.accessKeyID"),
		AccessKeySecret: viper.GetString("aliLog.accessKeySecret"),
		Endpoint:        viper.GetString("aliLog.endpoint"),
	}
	alilog.Init(opt)
}

// InitCommand 初始化命令行
func InitCommand() {
	utils.InitCommand()
}
